package xyz.xxin.xat.utils;

import android.content.Context;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;

/**
 * 定位工具类
 */
public class LocationUtils {
    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption;

    public AMapLocation aMapLocation;

    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient;

    private static LocationUtils locationUtils;

    public static LocationUtils getInstance(){
        if (locationUtils == null){
            locationUtils = new LocationUtils();
        }
        return locationUtils;
    }

    /**
     * 初始化
     */
    public void init(Context context){
        AMapLocationClient.updatePrivacyShow(context, true, true);
        AMapLocationClient.updatePrivacyAgree(context, true);

        // 初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();

        // 初始化定位
        try {
            mLocationClient = new AMapLocationClient(context);
        } catch (Exception e) {
            e.printStackTrace();
            init(context);
            return;
        }

        //设置定位回调监听
        mLocationClient.setLocationListener(
                aMapLocation -> LocationUtils.this.aMapLocation = aMapLocation);

        // 设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        // 设置定位模式为AMapLocationMode.Battery_Saving，低功耗模式。
        // mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
        // 设置定位模式为AMapLocationMode.Device_Sensors，仅设备模式。不需要连接网络，必须在室外环境下
        // mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);

        // 获取一次定位结果
        // 该方法默认为false。
        // mLocationOption.setOnceLocation(true);
        // 获取最近3s内精度最高的一次定位结果
        // 设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。
        // 如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        mLocationOption.setOnceLocationLatest(true);

        // 设置定位间隔,单位毫秒,默认为2000ms，最低1000ms。
        mLocationOption.setInterval(1000);

        // 设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);

        //设置是否允许模拟位置,默认为true，允许模拟位置
        mLocationOption.setMockEnable(false);

        //单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
        mLocationOption.setHttpTimeOut(8000);

        //关闭定位缓存机制
        mLocationOption.setLocationCacheEnable(false);

        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);

        //启动定位
        mLocationClient.startLocation();

        AMapLocationClientOption option = new AMapLocationClientOption();
        // 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
        option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
        if(null != mLocationClient){
            mLocationClient.setLocationOption(option);
            //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }
    }

    public AMapLocation getLocation(){
        if (aMapLocation != null) {
            if (aMapLocation.getErrorCode() == 0) {
                return aMapLocation;
            }
            else {
                //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                Log.e("AmapError","location Error, ErrCode:"
                        + aMapLocation.getErrorCode() + ", errInfo:"
                        + aMapLocation.getErrorInfo());
                return null;
            }
        }
        Log.e("AmapError", "getLocation: 获取不到定位点");
        return null;
    }
}



